package com.penghe.www.baselibrary.utils

import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Environment
import android.util.Log
import java.io.File
import java.io.FileOutputStream
import java.io.IOException


/**
 * Created by alm on 17-6-1.
 * 文件工具类
 */
object FileUtil {


    /**
     * 应用程序名(在文件管理器中的程序文件夹名)
     */
    private var APP_NAME: String? = null

    /**
     * 设置应用名称
     */
    fun setAppName(appName: String) {
        APP_NAME = appName
    }


    /**
     * 项目数据存储目录
     */
    val DATA_DIR = dataDir

    /**
     * apk存储目录
     */
    val APK_DIR = apkDir

    /**
     * 项目文件目录
     */
    val App_Dir = appDir

    /**
     * 项目缓存目录
     */
    val App_Cache = cache

    /**
     * 项目图片缓存目录
     */
    val IMAGE_DIR: File? = imageDir

    /**
     * 获取SD卡文件目录

     * @return 获取SD卡路径
     */
    private //获取挂载状态
            //如果是已挂载,说明了有内存卡
    val sdCardDir: File
        get() {
            val state = Environment.getExternalStorageState()
            if (Environment.MEDIA_MOUNTED == state) {
                return Environment.getExternalStorageDirectory()
            }
            throw NullPointerException("没有sd卡哦...")
        }

    /**
     * 获取本项目文件目录

     * @return 本项目文件目录
     */
    private val appDir: File
        get() = File(sdCardDir, APP_NAME)

    /**
     * 获取项目缓存文件目录

     * @return 项目缓存文件目录
     */
    private val cache: File
        get() = File(appDir, "cache")

    /**
     * 获取apk存储目录

     * @return apk存储目录
     */
    private val apkDir: File
        get() = File(appDir, "apk")

    /**
     * 获取图片目录

     * @return 图片目录
     */
    private val imageDir: File?
        get() {
            val imageDir = File(appDir, "image")
            val mkdirs: Boolean
            if (!imageDir.exists()) {
                mkdirs = imageDir.mkdirs()
                if (mkdirs) {
                    return imageDir
                } else {
                    return null
                }
            }
            return imageDir
        }

    /**
     * 安装apk

     * @param context 上下文
     * *
     * @param file    文件
     */
    fun installApk(context: Context, file: File) {
        val intent = Intent()
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        intent.action = Intent.ACTION_VIEW
        val type = "application/vnd.android.package-archive"
        intent.setDataAndType(Uri.fromFile(file), type)
        context.startActivity(intent)
    }

    /**
     * 获取项目数据目录

     * @return 项目数据目录
     */
    private val dataDir: File
        get() = File(appDir, "data")

    /**
     * 删除文件

     * @param fileName 文件名
     */
    fun delFile(fileName: String): Boolean {
        val file = File(appDir, fileName)
        if (file.isFile()) {

            file.delete()
            return true
        }

        file.exists()
        return false
    }

    /**
     * 保存图片

     * @param bm      位图图片
     * *
     * @param picName 文件名
     */
    fun saveBitmap(bm: Bitmap, picName: String) {
        Log.e("", "保存图片")
        //        Log.d("text", SDPATH);
        try {
            /* if (!isFileExist("")) {
                File tempf = createSDDir("");
            }*/

            val f = File(cache, picName + ".JPEG")
            if (f.exists()) {

                f.delete()
            }

            val out = FileOutputStream(f)
            bm.compress(Bitmap.CompressFormat.JPEG, 90, out)
            out.flush()
            out.close()
            Log.e("", "已经保存")
        } catch (e: IOException) {
            e.printStackTrace()
        }

    }

    /**
     * 检查文件是否存在

     * @param fileName 文件名
     * *
     * @return true表示文件存在
     */
    fun isFileExist(fileName: String): Boolean {
        val file = File(appDir, fileName)

        file.isFile
        return file.exists()
    }

    /**
     * 检查文件是否存在

     * @param path 文件路径
     * *
     * @return true表示文件存在
     */
    fun fileIsExists(path: String): Boolean {
        try {
            val f = File(path)
            if (!f.exists()) {
                return false
            }
        } catch (e: Exception) {

            return false
        }

        return true
    }
}